#!/bin/bash

# Skript fuer das Backup des home-Verzeichnisses mit rsync
# urspruengliches Skript von "uname" auf "http://wiki.ubuntuusers.de/skripte/Backup_mit_RSYNC" wurde angepasst

# Version 0.1
#  - check mountpoint
#  - generate packeges list
#  - generate log file
#  - Benutzung einer externen config-Datei -> ~/.BackupMyHome/BMH_conf.sh

#  -------------------------------------
# Todo:
#  - Erkennung des Rechners und des Users --> setzen unterschiedlicher Pfade
#  - Verschluesseltes Archiv erzeugen
#  - Ablage auf externer Server
#  - über "-shutdown" Rechner herunterfahren mit -> gnome-session-save --shutdown-dialog
#  - Konzept über Backup mehrerer Verzeichnisse /etc oder /var... (mit include?)
#  - File als Liste der Excludes



### do not edit ###
#Befehle anlgen als Variable
MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh"
LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; RM="/bin/rm"
DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail"
CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync"
LAST="last"; INC="--link-dest=../$LAST"


source /home/klaus/.BackupMyHome/BMH_conf.sh

echo "$SHELLTEXT"

#Date in Logfile schreiben
$DATE > $LOG




notify-send "Ein Backup wird im Hintergrund durchgeführt"

#Wenn PACKAGES ungleich NULL und FROMSSH gleich 0 dann erstelle Packetlsite in PackFile
if [ -n "$PACKAGES" ] && [ -z "$FROMSSH" ]; then
  $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '" >> $LOG 2>&1
  $DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' '  >> $PackFile  2>> $PackFile
fi


#Wenn MOUNTPOINT in mount enthalten dann weiter, ansonsten Skripabbruch
MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT");
if [ -z "$MOUNTPOINT" ] || [ -n "$MOUNTED" ]; then
## Entweder monatliches Rotieren rotieren oder Tagesdatum
  #if [ "$MONTHROTATE" -eq 1 ]; then
    #TODAY=$($DATE +%d)
  #else
    #TODAY=$($DATE +%y%m%d)
  #fi
  

  if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then
    S="$SSH -p $SSHPORT -l $SSHUSER";
  fi
# Schleife über Anzahl der verzeichnisse in SOURCE
  for SOURCE in $($ECHO $SOURCES)
  do
    if [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ]; then
        $ECHO "$RSYNC -e \"$S\" -avR $FROMSSH:$SOURCE $RSYNCCONF $TARGET$TODAY $INC"  >> $LOG
        $RSYNC -e "$S" -avR $FROMSSH:$SOURCE $RSYNCCONF $TARGET$TODAY $INC >> $LOG 2>> $LOG
      if [ $? -ne 0 ]; then # exit status des letztes Befehls nicht Null dann Fehler
        ERROR=1
      fi
    fi
    if [ "$S" ]  && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
        $ECHO "$RSYNC -e \"$S\" -avR $SOURCE $RSYNCCONF $TOSSH:$TARGET$TODAY $INC "  >> $LOG
        $RSYNC -e "$S" -avR $SOURCE $RSYNCCONF $TOSSH:$TARGET$TODAY $INC >> $LOG 2>> $LOG
      if [ $? -ne 0 ]; then
        ERROR=1
      fi
    fi
    # Wenn kein SSH dann folgender RSYNC - Befehl
    if [ -z "$S" ]; then
      $ECHO "$RSYNC -avR $SOURCE $RSYNCCONF $TARGET"  >> $LOG 2>> $LOG;
      $RSYNC -avR $SOURCE $RSYNCCONF $TARGET >> $LOG 2>> $LOG
      if [ $? -ne 0 ]; then
        ERROR=1
      fi
    fi
  done

  # Anlegen von Hard-Links
#  if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
#   $ECHO "$SSH -p $SSHPORT -l $SSHUSER $TOSSH $LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG  
#   $SSH -p $SSHPORT -l $SSHUSER $TOSSH "$LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG 2>> $LOG
#  if [ $? -ne 0 ]; then
#      ERROR=1
#    fi
#  fi
#  if ( [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] );  then
#    $ECHO "$LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG
#    $LN -nsf $TARGET$TODAY $TARGET$LAST  >> $LOG 2>> $LOG
#    if [ $? -ne 0 ]; then
#      ERROR=1
#    fi
#  fi

  $DATE >> $LOG

else
   $ECHO "$MOUNTPOINT not mounted" >> $LOG
   notify-send "$MOUNTPOINT not mounted"
fi
if [ -n "$MAILREC" ]; then
  if [ $ERROR ];then
    $MAIL -s "Error Backup $LOG" $MAILREC < $LOG
  else
    $MAIL -s "Backup $LOG" $MAILREC < $LOG
  fi
fi

if [ $ERROR ];then
	notify-send -i /usr/share/icons/gnome/32x32/status/dialog-warning.png "Warnung" "Es ist ein Fehler beim Backup aufgetreten! Siehe $LOG"
else
	notify-send "Backup war erfolgreich."
fi

exit 0

